package stream

type (
	// Item 定义数据流元素的基础接口
	Item[T any] interface {
		// GetValue 获取元素值
		GetValue() T
		// GetGroup 获取元素组
		GetGroup() string
		// GetIndex 获取元素索引
		GetIndex() uint64

		// WithValue 设置元素值
		WithValue(value T) Item[T]
		// WithGroup 设置元素组
		WithGroup(group string) Item[T]
		// WithIndex 设置元素索引
		WithIndex(index uint64) Item[T]
	}

	// item 定义数据流元素的基础结构
	item[T any] struct {
		// 最大索引：18446744073709551615
		//
		// 1秒1亿条数据时，1年的数据量：3162240000000000 = 100000000（秒）* 3600（时）* 24（天）* 366（年）
		//
		// 1秒1亿条数据时，大约使用年限：5833（年）= 18446744073709551615 / 3162240000000000
		index uint64
		group string
		value T
	}
)

// NewItem 新建一个基础数据流元素
func NewItem[T any](value T) Item[T] {
	return &item[T]{
		value: value,
	}
}

// GetValue 获取元素值
func (own *item[T]) GetValue() T {
	return own.value
}

// GetGroup 获取元素组
func (own *item[T]) GetGroup() string {
	return own.group
}

// GetIndex 获取元素索引
func (own *item[T]) GetIndex() uint64 {
	return own.index
}

// WithValue 设置元素值
func (own *item[T]) WithValue(value T) Item[T] {
	own.value = value
	return own
}

// WithGroup 设置元素组
func (own *item[T]) WithGroup(group string) Item[T] {
	own.group = group
	return own
}

// WithIndex 设置元素索引
func (own *item[T]) WithIndex(index uint64) Item[T] {
	own.index = index
	return own
}
